package com.zh.dynamicproxyforandroid.proxy;

import android.content.Context;


import leo.android.cglib.proxy.Enhancer;
import leo.android.cglib.proxy.MethodInterceptor;
import leo.android.cglib.proxy.MethodProxy;

/**
 * @author wally
 * @date 2022/12/29
 * CGLIB动态代理
 */
public class ProxyFactoryByCglib {
    public static Object getProxy(Context context, Object target) {
        Enhancer enhancer = new Enhancer(context);
        enhancer.setSuperclass(target.getClass());
        enhancer.setInterceptor(new MethodInterceptor() {
            @Override
            public Object intercept(Object obj, Object[] args, MethodProxy methodProxy) throws Exception {
                //参数1：Object obj: Object为由CGLib动态生成的代理类实例，Method为上文中实体类所调用的被代理的方法引用
                //参数2： Object[] args： 目标对象方法参数数组对象
                //参数3： MethodProxy methodProxy： 为生成的代理类对方法的代理引用

                //增强1：输出日志
                System.out.println("日志之前");

                //执行目标方法
                Object result = methodProxy.invokeSuper(obj, args);

                //增强2：输出日志
                System.out.println("日志之后");

                return result;
            }
        });
        return enhancer.create();
    }
}